const promisify = (fn) => {
  // args装新fn的参数
  return function (...args) {
    return new Promise((resolve, reject) => {
      // args展开参数，作为老fn的入参，并实现回调签名
      fn.call(this, ...args, (err, result) => {
        if (err) reject(err);
        else resolve(result);
      });
    });
  };
};

// 实际使用示例
function oldStyleFunction(a, b, callback) {
  setTimeout(() => {
    callback(null, a + b);
  }, 100);
}

const newFunction = promisify(oldStyleFunction);

newFunction(1, 2).then((res) => console.log(res));

// 使用示例
// 定义一个符合Node.js回调风格的函数（错误优先回调）
function asyncOperation(value, callback) {
  setTimeout(() => {
    if (value < 0) {
      callback(new Error("值不能为负数"), null);
    } else {
      callback(null, value * 2);
    }
  }, 100);
}

// 使用 promisify 包装
const promisifiedOperation = promisify(asyncOperation);

// 现在可以像使用 Promise 一样使用它
promisifiedOperation(5)
  .then((result) => console.log("结果:", result)) // 结果: 10
  .catch((error) => console.error("错误:", error.message));

// // 测试错误情况
// promisifiedOperation(-1)
//   .then((result) => console.log("结果:", result))
//   .catch((error) => console.error("错误:", error.message)); // 错误: 值不能为负数

// // 也可以使用 async/await
// async function test() {
//   try {
//     const result = await promisifiedOperation(3);
//     console.log("Async/await 结果:", result); // Async/await 结果: 6
//   } catch (error) {
//     console.error("Async/await 错误:", error.message);
//   }
// }

// test();
